home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / ast_comp / yyref.shr < prev   
Text File  |  1993-07-04  |  12KB  |  684 lines

  1. #!/bin/sh
  2. # This is a shell archive (produced by shar 3.49)
  3. # To extract the files from this archive, save it to a file, remove
  4. # everything above the "!/bin/sh" line above, and type "sh file_name".
  5. #
  6. # made 11/06/1991 21:23 UTC by johnl@iecc
  7. # Source directory /usr/johnl/News
  8. #
  9. # existing files will NOT be overwritten unless -c is specified
  10. #
  11. # This shar contains:
  12. # length  mode       name
  13. # ------ ---------- ------------------------------------------
  14. #    221 -rw-r--r-- yyref/Makefile
  15. #   4607 -rw-r--r-- yyref/yyref-grammar
  16. #   2697 -rw-r--r-- yyref/yyref-lex
  17. #   1806 -rw-r--r-- yyref/yyref.1
  18. #
  19. # ============= yyref/Makefile ==============
  20. if test ! -d 'yyref'; then
  21.     echo 'x - creating directory yyref'
  22.     mkdir 'yyref'
  23. fi
  24. if test -f 'yyref/Makefile' -a X"$1" != X"-c"; then
  25.     echo 'x - skipping yyref/Makefile (File already exists)'
  26. else
  27. echo 'x - extracting yyref/Makefile (Text)'
  28. sed 's/^X//' << 'SHAR_EOF' > 'yyref/Makefile' &&
  29. X
  30. CFLAGS=
  31. yyref:    yyref-lex yyref-grammar
  32. X    lex yyref-lex
  33. X    yacc -vd yyref-grammar
  34. X    cc $(CFLAGS) y.tab.c -o yyref
  35. X
  36. clean:
  37. X    rm -f lex.yy.c y.tab.? y.output
  38. X
  39. force:    yyref-lex yyref-grammar
  40. X    touch yyref-lex yyref-grammar
  41. X    make
  42. X
  43. SHAR_EOF
  44. chmod 0644 yyref/Makefile ||
  45. echo 'restore of yyref/Makefile failed'
  46. Wc_c="`wc -c < 'yyref/Makefile'`"
  47. test 221 -eq "$Wc_c" ||
  48.     echo 'yyref/Makefile: original size 221, current size' "$Wc_c"
  49. fi
  50. # ============= yyref/yyref-grammar ==============
  51. if test -f 'yyref/yyref-grammar' -a X"$1" != X"-c"; then
  52.     echo 'x - skipping yyref/yyref-grammar (File already exists)'
  53. else
  54. echo 'x - extracting yyref/yyref-grammar (Text)'
  55. sed 's/^X//' << 'SHAR_EOF' > 'yyref/yyref-grammar' &&
  56. %{
  57. X
  58. # include <ctype.h>
  59. X
  60. int    line;
  61. %}
  62. X
  63. X
  64. X    /*******************************************************\
  65. X    *                            *
  66. X    *    X_reference program for YACC files        *
  67. X    *    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        *
  68. X    *                            *
  69. X    *    Cathy Taylor,                    *
  70. X    *    c/o Department of Computing,            *
  71. X    *    University of Lancaster,            *
  72. X    *    Bailrigg, Lancaster, England.            *
  73. X    *    Date : Fri Jul  4 00:50:04 BST 1986        *
  74. X    *                            *
  75. X    \*******************************************************/
  76. X
  77. X
  78. X    /***********************************************\
  79. X    *                        *
  80. X    *    Yacc Input Syntax            *
  81. X    *    ~~~~~~~~~~~~~~~~~            *
  82. X    *                        *
  83. X    *    Adapted from the document        *
  84. X    *    'YACC - Yet Another Compiler Compiler'    *
  85. X    *        by                *
  86. X    *       S. C. Johnson            *
  87. X    *                        *
  88. X    *    Date: Tue Jul  1 02:40:18 BST 1986    *
  89. X    *                        *
  90. X    \***********************************************/
  91. X
  92. X
  93. %token    IDENTIFIER CHARACTER NUMBER
  94. %token    LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION
  95. %token    PER PERCURL ACT
  96. %token    COLON SEMICOLON COMMA OR LESS GREATER
  97. X
  98. %start    spec
  99. X
  100. %%
  101. X
  102. spec
  103. X    :    defs PER rules tail
  104. X            {
  105. X                printf("\n\n");
  106. X                yyclearin;
  107. X                return(0);
  108. X            }
  109. X    ;
  110. X
  111. tail
  112. X    :    /* empty */
  113. X    |    PER
  114. X    |    error
  115. X    ;
  116. X
  117. defs
  118. X    :    /* empty */
  119. X    |    def_bk
  120. X    ;
  121. X
  122. def_bk
  123. X    :    def
  124. X    |    def_bk def
  125. X    ;
  126. X
  127. def
  128. X    :    START IDENTIFIER
  129. X    |    UNION
  130. X    |    PERCURL
  131. X    |    rword tag nlist
  132. X    |    tokendef
  133. X    |    error
  134. X    ;
  135. X
  136. rword
  137. X    :    LEFT
  138. X    |    RIGHT
  139. X    |    NONASSOC
  140. X    |    TYPE
  141. X    ;
  142. X
  143. tokendef
  144. X    :    TOKEN tokenlist
  145. X    ;
  146. X
  147. tokenlist
  148. X    :    IDENTIFIER
  149. X        {
  150. X            yyaction(ON_C_IDENT,line);
  151. X        }
  152. X    |    tokenlist opt_comma IDENTIFIER
  153. X        {
  154. X            yyaction(ON_C_IDENT,line);
  155. X        }
  156. X    ;
  157. tag
  158. X    :    /* empty */
  159. X    |    LESS IDENTIFIER GREATER
  160. X    ;
  161. X
  162. nlist
  163. X    :    nmno
  164. X    |    nlist opt_comma nmno
  165. X    ;
  166. X
  167. opt_comma
  168. X    :    /* empty */
  169. X    |    COMMA
  170. X    ;
  171. X
  172. nmno
  173. X    :    IDENTIFIER opt_num
  174. X    ;
  175. X
  176. opt_num
  177. X    :    /* empty */
  178. X    |    NUMBER
  179. X    ;
  180. rules
  181. X    :    rule
  182. X    |    rules rule
  183. X    ;
  184. X
  185. rule
  186. X    :    IDENTIFIER
  187. X        {
  188. X            yyaction(ON_C_IDENT,line);
  189. X        }
  190. X        COLON body SEMICOLON
  191. X    |    error SEMICOLON
  192. X    ;
  193. X
  194. body
  195. X    :    body_block
  196. X    |    body OR body_block
  197. X    ;
  198. X
  199. body_block
  200. X    :    /* empty */
  201. X    |    body_block body_entity
  202. X    ;
  203. X
  204. body_entity
  205. X    :    opt_prec id_ent
  206. X    |    ACT
  207. X    ;
  208. X
  209. id_ent
  210. X    :    IDENTIFIER
  211. X        {
  212. X            yyaction(ON_IDENT,line);
  213. X        }
  214. X    |    CHARACTER
  215. X    ;
  216. X
  217. opt_prec
  218. X    :    /* empty */
  219. X    |    PREC
  220. X    ;
  221. X
  222. X
  223. %%
  224. X
  225. # include    "lex.yy.c"
  226. X
  227. #define    ON_C_IDENT    000
  228. #define    ON_IDENT    001
  229. X
  230. #define    MAXIDENTS    1000
  231. #define    MAXCHARS    100
  232. #define    MAXDEFS        20
  233. #define    MAXOCCS        1000
  234. X
  235. struct    IREC {
  236. X        char    ident[MAXCHARS];
  237. X        int    desc[MAXDEFS];
  238. X        int    nextdesc;
  239. X        int    occ[MAXOCCS];
  240. X        int    nextocc;
  241. X        } table[MAXIDENTS];
  242. X
  243. X
  244. yyaction (action,ln)
  245. int    action;
  246. int    ln;
  247. {
  248. X    int    id;
  249. X    
  250. X    id = 0;
  251. X    while (    strcmp(table[id].ident,yytext) != 0 && strcmp(table[id].ident,"") != 0 )
  252. X        id++;
  253. X
  254. X    if ( strcmp(table[id].ident, yytext) != 0 )
  255. X    {
  256. X
  257. X    /*******************************************************\
  258. X    *                            *
  259. X    *    New non-terminal to be stored.            *
  260. X    *    No distinction is made here between tokens    *
  261. X    *    and (non) terminals.                *
  262. X    *                            *
  263. X    \*******************************************************/
  264. X
  265. X        strcpy(table[id].ident,yytext);
  266. X        table[id].nextdesc = 0;
  267. X        table[id].nextocc = 0;
  268. X    } /* fi */
  269. X
  270. X    switch (action) {
  271. X    case ON_C_IDENT:
  272. X
  273. X    /*******************************************************\
  274. X    *                            *
  275. X    *    Add to list of definition lines.        *
  276. X    *                            *
  277. X    \*******************************************************/
  278. X
  279. X        table[id].desc[table[id].nextdesc++] = ln;
  280. X        break;
  281. X
  282. X    case ON_IDENT:
  283. X                
  284. X    /*******************************************************\
  285. X    *                            *
  286. X    *    Add to list of occurance lines.            *
  287. X    *                            *
  288. X    \*******************************************************/
  289. X
  290. X        table[id].occ[table[id].nextocc++] = ln;
  291. X        break;
  292. X
  293. X    default        :
  294. X        fprintf (stdout, "yyaction: invalid action\n");
  295. X        return (-1);
  296. X        } /* hctiws */
  297. X    return (0);
  298. } /* corp */
  299. X
  300. nline(ln)
  301. int    ln;
  302. {
  303. X    printf("%4d :\t",ln);
  304. }
  305. X
  306. X
  307. X    char    declared_at_mark[] = "*";
  308. X    char    occurs_at_mark[] = "";
  309. X    char    token_maybe[] = "is not declared";
  310. X    char    start_maybe[] = "never occurs on rhs of rule - start rule?";
  311. X    
  312. /*
  313. *    Strings for output
  314. */
  315. X
  316. main ()
  317. {
  318. X    int    ind,id;
  319. X
  320. X    strcpy(table[0].ident,"");
  321. X
  322. X    line = 0;
  323. X    nline(++line);
  324. X
  325. X    yyparse ();
  326. X
  327. X    printf("\n\n~~~~~ Start of X-ref ~~~~~\n");
  328. X    id = 0;
  329. X    while( strcmp(table[id].ident,"") != 0 )
  330. X    {
  331. X        printf("\n%-20s ",table[id].ident);
  332. X        if (table[id].nextdesc == 0 )
  333. X            printf("    : %s",token_maybe);
  334. X        else
  335. X        {
  336. X            ind = 0;
  337. X            printf("%4d:",table[id].desc[ind++]);
  338. X            for ( ind=1; ind < table[id].nextdesc ; ind++)
  339. X            printf(" %s%4d",declared_at_mark,table[id].desc[ind]);
  340. X        }
  341. X        if (table[id].occ[0] == 0)
  342. X            printf(" %s",start_maybe);
  343. X        else
  344. X        {
  345. X            for ( ind = 0; ind < table[id].nextocc ; ind++ )
  346. X            printf(" %s%4d",occurs_at_mark,table[id].occ[ind]);
  347. X        }
  348. X        id++;
  349. X    }
  350. X    printf("\n\n~~~~~ End of X-ref ~~~~~\n");
  351. } /* niam */
  352. X
  353. yyerror(mess)
  354. char    *mess;
  355. {
  356. X    printf("\n\t%s\n",mess);
  357. } /* corp */
  358. SHAR_EOF
  359. chmod 0644 yyref/yyref-grammar ||
  360. echo 'restore of yyref/yyref-grammar failed'
  361. Wc_c="`wc -c < 'yyref/yyref-grammar'`"
  362. test 4607 -eq "$Wc_c" ||
  363.     echo 'yyref/yyref-grammar: original size 4607, current size' "$Wc_c"
  364. fi
  365. # ============= yyref/yyref-lex ==============
  366. if test -f 'yyref/yyref-lex' -a X"$1" != X"-c"; then
  367.     echo 'x - skipping yyref/yyref-lex (File already exists)'
  368. else
  369. echo 'x - extracting yyref/yyref-lex (Text)'
  370. sed 's/^X//' << 'SHAR_EOF' > 'yyref/yyref-lex' &&
  371. X
  372. X    /*******************************************************\
  373. X    *                            *
  374. X    *    X_ref for YACC - LEX file            *
  375. X    *    ~~~~~~~~~~~~~~~~~~~~~~~~~            *
  376. X    *    Date: Tue Jul  1 03:36:21 BST 1986        *
  377. X    *                            *
  378. X    \*******************************************************/
  379. X
  380. %{
  381. X
  382. #define        TRUE 1
  383. #define         FALSE 0
  384. X
  385. int    recognised;
  386. int     scope;
  387. char    c, lastchar, thischar;
  388. X
  389. %}
  390. X
  391. X    /* abbreviations */
  392. X
  393. digit        [0-9]
  394. u_case        [A-Z]
  395. l_case        [a-z]
  396. id_char        [A-Za-z0-9_\.]
  397. letter        [A-Za-z\._]
  398. white        [\t ]
  399. X
  400. X
  401. %%
  402. X
  403. "/*"            {
  404. X                ECHO;
  405. X                recognised = FALSE;
  406. X                c = nextchar();
  407. X                while (recognised == FALSE)
  408. X                {
  409. X                    while (c != '*')
  410. X                        c = nextchar();
  411. X                    c = nextchar();
  412. X                    if (c == '\/')
  413. X                        recognised = TRUE;
  414. X                }
  415. X            }
  416. "%{"            {
  417. X                ECHO;
  418. X                recognised = FALSE;
  419. X                c = nextchar();
  420. X                while (recognised == FALSE)
  421. X                {
  422. X                    while (c != '\%')
  423. X                        c = nextchar();
  424. X                    c = nextchar();
  425. X                    if (c == '\}')
  426. X                        recognised = TRUE;
  427. X                }
  428. X                return(PERCURL);
  429. X            }
  430. "{"            {
  431. X
  432. /*
  433. *    Although LEX can cope with the full definition,
  434. *    ( "{"[^\}]*"}" ) this may overrun the lex buffer (200 chars).
  435. *    Thus this routine.
  436. */
  437. X
  438. X  ECHO;
  439. X  c = nextchar();
  440. X  scope = 1;
  441. X  while (scope > 0)
  442. X    {
  443. X      c = nextchar();
  444. X      switch (c)
  445. X    {
  446. X    case '*':
  447. X      if (lastchar == '/')
  448. X        do
  449. X          c = nextchar();
  450. X      while ((lastchar != '*') || (c != '/'));
  451. X      break;
  452. X    case '"':
  453. X      do
  454. X        c = nextchar();
  455. X      while ((lastchar == '\\') || (c != '"'));
  456. X      break;
  457. X    case '{': 
  458. X      scope++; 
  459. X      break;
  460. X    case '}': 
  461. X      scope--; 
  462. X      break;
  463. X    default:
  464. X      break;
  465. X    }
  466. X    }
  467. X  return(ACT);
  468. }
  469. X
  470. X
  471. X
  472. {letter}{id_char}*    {
  473. X                ECHO;
  474. X                return(IDENTIFIER);
  475. X            }
  476. "'"(\\.|[^'])+"'"    {
  477. X                ECHO;
  478. X                return(CHARACTER);
  479. X            }
  480. {white}+        {    
  481. X                ECHO;
  482. X            }
  483. {digit}+        {
  484. X                ECHO;
  485. X                return(NUMBER);
  486. X            }
  487. "%"{white}*"left"    {
  488. X                ECHO;
  489. X                return(LEFT);
  490. X            }
  491. "%"{white}*"right"    {
  492. X                ECHO;
  493. X                return(RIGHT);
  494. X            }
  495. "%"{white}*"nonassoc"    {
  496. X                ECHO;
  497. X                return(NONASSOC);
  498. X            }
  499. "%"{white}*"token"    {
  500. X                ECHO;
  501. X                return(TOKEN);
  502. X            }
  503. "%"{white}*"prec"    {
  504. X                ECHO;
  505. X                return(PREC);
  506. X            }
  507. "%"{white}*"type"    {
  508. X                ECHO;
  509. X                return(TYPE);
  510. X            }
  511. "%"{white}*"start"    {
  512. X                ECHO;
  513. X                return(START);
  514. X            }
  515. "%"{white}*"union"    {
  516. X                ECHO;
  517. X                return(UNION);
  518. X            }
  519. "%%"            {
  520. X                ECHO;
  521. X                return(PER);
  522. X            }
  523. ":"            {
  524. X                ECHO;
  525. X                return(COLON);
  526. X            }
  527. ";"            {
  528. X                ECHO;
  529. X                return(SEMICOLON);
  530. X            }
  531. ","            {
  532. X                ECHO;
  533. X                return(COMMA);
  534. X            }
  535. "|"            {
  536. X                ECHO;
  537. X                return(OR);
  538. X            }
  539. "<"            {
  540. X                ECHO;
  541. X                return(LESS);
  542. X            }
  543. ">"            {
  544. X                ECHO;
  545. X                return(GREATER);
  546. X            }
  547. "\n"            {
  548. X                ECHO;
  549. X                nline(++line);
  550. X            }
  551. X
  552. %%
  553. X
  554. yywrap()
  555. {
  556. X    /* wrap-up procedure */
  557. X    return(1);
  558. }
  559. X
  560. nextchar()
  561. {
  562. X    char    c;
  563. X    
  564. X    c = input();
  565. X    printf("%c",c);
  566. X    if (c == '\n')
  567. X        nline(++line);
  568. X    lastchar = thischar;
  569. X    thischar = c;
  570. X    return(c);
  571. }
  572. SHAR_EOF
  573. chmod 0644 yyref/yyref-lex ||
  574. echo 'restore of yyref/yyref-lex failed'
  575. Wc_c="`wc -c < 'yyref/yyref-lex'`"
  576. test 2697 -eq "$Wc_c" ||
  577.     echo 'yyref/yyref-lex: original size 2697, current size' "$Wc_c"
  578. fi
  579. # ============= yyref/yyref.1 ==============
  580. if test -f 'yyref/yyref.1' -a X"$1" != X"-c"; then
  581.     echo 'x - skipping yyref/yyref.1 (File already exists)'
  582. else
  583. echo 'x - extracting yyref/yyref.1 (Text)'
  584. sed 's/^X//' << 'SHAR_EOF' > 'yyref/yyref.1' &&
  585. .TH YYREF 1 LOCAL
  586. .SH NAME
  587. yyref \- generate cross\-reference for YACC input
  588. .SH SYNOPSIS
  589. .B yyref
  590. [ < inputfile ]
  591. .SH DESCRIPTION
  592. .I Yyref
  593. generates cross\-references for
  594. .IR yacc (1)
  595. input files.
  596. It reads source from standard input, and upon EOF or seeing the second
  597. .B %%
  598. that marks the end of the rules portion, generates a cross\-reference
  599. list of all parser tokens.
  600. .PP
  601. In case of syntax errors in the input,
  602. .I yyref
  603. tries to generate as much information as it can.
  604. .PP
  605. The output consists of a number listing of the header and rules part,
  606. followed by the cross\-reference:
  607. .RS
  608. .nf
  609. X   1 :    %{
  610. X   2 :    # include <ctype.h>
  611. X   3 :    %}
  612. X   4 :    
  613. X   5 :    
  614. X   6 :        /*******************************************************\
  615. X   7 :        *                            *
  616. X   8 :        *    Date : Fri Jul  4 00:50:04 BST 1986        *
  617. X   9 :        *                            *
  618. X  10 :        \*******************************************************/
  619. X  11 :    
  620. X  12 :    %token    IDENTIFIER START_TOKEN NUMBER
  621. X  13 :    
  622. X  14 :    %start    small
  623. X  15 :    
  624. X  16 :    %%
  625. X  17 :    
  626. X  18 :    small
  627. X  19 :        :    start middle
  628. X  20 :                {
  629. X  21 :                    printf("\n\nMiddle");
  630. X  22 :                    yyclearin;
  631. X  23 :                    return(0);
  632. X  24 :                }
  633. X  25 :            end postamble
  634. X  26 :        ;
  635. X  27 :    
  636. X  28 :    start
  637. X  29 :        :    /* empty */
  638. X  30 :        |    START_TOKEN
  639. X  31 :        ;
  640. X  32 :    
  641. X  33 :    middle
  642. X  34 :        :
  643. X  35 :        ;
  644. X  36 :    
  645. X  37 :    middle
  646. X  38 :        :    MID_TOKEN
  647. X  39 :        |    /* empty */
  648. X  40 :        ;
  649. X  41 :    
  650. X  42 :    %%
  651. X
  652. X
  653. 'small' -
  654. ~~~~~~~        *18 , never occurs on rhs of rule - start rule?
  655. 'start' -
  656. ~~~~~~~        *28 , 19
  657. 'middle' -
  658. ~~~~~~~        *33 , *37, 19
  659. 'end' -
  660. ~~~~~~~        is not declared - token??, 25
  661. 'postamble' -
  662. ~~~~~~~        is not declared - token??, 25
  663. 'START_TOKEN' -
  664. ~~~~~~~        is not declared - token??, 30
  665. 'MID_TOKEN' -
  666. ~~~~~~~        is not declared - token??, 38
  667. X
  668. X    End of X-ref
  669. X    ~~~~~~~~~~~~
  670. .fi
  671. .RE
  672. .SH BUGS
  673. Should be able to understand the
  674. .I %token
  675. and similar directives.
  676. SHAR_EOF
  677. chmod 0644 yyref/yyref.1 ||
  678. echo 'restore of yyref/yyref.1 failed'
  679. Wc_c="`wc -c < 'yyref/yyref.1'`"
  680. test 1806 -eq "$Wc_c" ||
  681.     echo 'yyref/yyref.1: original size 1806, current size' "$Wc_c"
  682. fi
  683. exit 0
  684.